<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../react18/react.development.js"></script>
    <script src="../react18/react-dom.development.js"></script>
    <script src="../react18/babel.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="text/babel">
      /*
        useContext:
          * 共享状态钩子,主要给后代组件共享一些数据
          * 共享的过程
            1.  首先在提供共享数据的组件中使用 React.createContext({}) 方法 创建一个上下文对象
            2. 上下文对象提供了一个组件<上下文对象.Provider>,这个组件的value属性的数据,会给所有组件内部的后代组件共享
            3. 在接收共享数据的组件中使用useContext(xxxContext)钩子函数用来引入 某个祖辈组件的xxxContext对象共享的数据  
          * 如果共享的是一个函数,则可以让后代组件调用这个函数,修改共享组件共享的数据
      */
      //首先使用 React.createContext({}) 方法 创建一个上下文对象
      // 上下文对象提供了一个组件<上下文对象.Provider>,这个组件的value属性的数据,会给所有组件内部的后代组件共享

      const AppContext = React.createContext({});

      function Header() {
        //在接收共享数据的组件中使用useContext(xxxContext)钩子函数用来引入 某个祖辈组件的xxxContext对象共享的数据
        const { count } = React.useContext(AppContext);
        return (
          <div>
            <h2>Header:{count}</h2>
          </div>
        );
      }

      function Nav() {
        let { count, setCount } = React.useContext(AppContext);
        console.log(setCount);
        return (
          <div>
            <h3>Nav:{count}</h3>
            <button
              onClick={() => {
                setCount((x) => x + 1);
              }}
            >
              修改
            </button>
          </div>
        );
      }

      function Footer() {
        const { count } = React.useContext(AppContext);
        return (
          <div>
            <h2>Footer:{count}</h2>
            <Nav />
          </div>
        );
      }

      function App() {
        const [count, setCount] = React.useState(0);

        return (
          <div>
            <h1>App</h1>
            <AppContext.Provider value={{ count, name: "xiaowang", setCount }}>
              <Header />
              <Footer />
            </AppContext.Provider>
          </div>
        );
      }
      ReactDOM.createRoot(document.getElementById("app")).render(<App />);
    </script>
  </body>
</html>
